★サンプルコードを利用するにあたっての注意事項★

■Linux/Unix環境でMySQLを利用する方への注意事項

以下に挙げる注意事項は、Linux/Unix環境でMySQLを利用される方に限定した注意喚起です。
WindowsでMySQLを使われる方や、そもそもOracleやPostgreSQLを利用される方には該当しません。

Linux/UnixでMySQLを利用する場合、テーブル名の大文字と小文字が区別される点に注意する必要があります。この理由は、Linux/Unix環境におけるMySQLでは、lower_case_table_namesというシステム変数の値がデフォルトで0に設定されており、そのため、CREATE TABLE文で作成したテーブル名の大文字と小文字は厳密に区別されます。この場合、「Shops」と「shops」は異なるテーブル名と見なされるということです。そのため、「Shops」という名前でテーブルを作成した後に、SELECT文のFROM句で「shops」と指定すると、テーブルが見つからずエラーになります。

本サンプルコードに含まれているSQL文を利用する限りこの問題を気にする必要はないのですが、自分でテーブルを作る場合にハマることがあるポイントなので注意してください。

参考：MySQL 8.0 リファレンスマニュアル - 9.2.3 識別子の大文字と小文字の区別
https://dev.mysql.com/doc/refman/8.0/ja/identifier-case-sensitivity.html


■PostgreSQLでpg_hint_planを使用する方への注意事項

PostgreSQL側でヒント句を使用するための機能として、「pg_hint_plan」があります。これを利用する場合も、テーブル名の大文字と小文字に注意する必要があります。具体的には、ヒント内ではテーブル名をすべて小文字で記述する必要があります。

例えば、「Shops」テーブルの主キーのインデックスを強制するヒント句を書こうとした場合、以下のように「Shops」と大文字を含めるとIndexScanヒントが有効になりません。

/* ヒント句が有効にならないケース */
testdb=> explain 
SELECT /*+ IndexScan(Shops pk_shops) */
  FROM Shops
 WHERE shop_id = '00050’;

                     QUERY PLAN                      
-----------------------------------------------------
 Seq Scan on shops  (cost=0.00..1.75 rows=1 width=0)
   Filter: (shop_id = '00050'::bpchar)
(2 rows)

このケースでは、正しくは次のように記述する必要があります。

/* ヒント句が有効になるケース */
testdb=> explain 
SELECT /*+ IndexScan(shops pk_shops) */
  FROM Shops
 WHERE shop_id = '00050’;


                              QUERY PLAN                              
----------------------------------------------------------------------
 Index Scan using pk_shops on shops  (cost=0.14..8.16 rows=1 width=0)
   Index Cond: (shop_id = '00050'::bpchar)
(2 rows)

